﻿Option Strict Off
Option Explicit On

Imports System.IO

Public Class Logger
    Protected m_ExisteDirectorio As Boolean
    Protected m_Indent As String
    Protected m_FileName As String
    Protected m_StreamFile As StreamWriter
    Protected m_Path As String
    Protected m_Today As Date
    Protected m_Escribe As Boolean

    Public Property FileName() As String
        Get
            Return m_FileName
        End Get
        Set(ByVal value As String)
            m_FileName = value
        End Set
    End Property

    Public Property Path() As String
        Get
            Return m_Path
        End Get
        Set(ByVal value As String)
            m_Path = value
        End Set
    End Property

    Public Property Indent() As String
        Get
            Return m_Indent
        End Get
        Set(ByVal Value As String)
            m_Indent = Value
        End Set
    End Property

    Protected Sub Append(ByVal FullFileName As String, ByVal Data As String)
        If m_StreamFile Is Nothing Then
            m_StreamFile = New StreamWriter(New FileStream(FullFileName, FileMode.OpenOrCreate, FileAccess.ReadWrite))
        End If

        m_StreamFile.WriteLine("{0}|{1}{2}", Now.ToString("hh:mm:ss"), vbTab, Data)
        m_StreamFile.Flush()
    End Sub

    Public Sub Append(ByVal Data As String)
        If m_ExisteDirectorio And m_Escribe Then
            Append(m_Path & "\" & m_FileName, Data)
        End If
    End Sub

    Public Sub CloseAppend()
        'm_StreamFile.Flush()
        m_StreamFile.Close()
    End Sub

    Public Sub AddIndent()
        m_Indent = m_Indent & "  "
    End Sub

    Public Sub DelIndent()
        If Len(m_Indent) > 0 Then
            m_Indent = Left(m_Indent, Len(m_Indent) - 2)
        End If
    End Sub

    Public Sub New()
        m_Today = Now
        m_Indent = ""
    End Sub

    ''' <summary>
    ''' Crea un archivo de Log
    ''' </summary>
    ''' <param name="Directorio">
    ''' Directorio en el que se guarda el archivo de Log
    ''' </param>
    ''' <param name="Archivo">
    ''' Nombre del archivo de Log
    ''' </param>
    ''' <remarks></remarks>
    Public Sub New(ByVal Directorio As String, ByVal Archivo As String, Optional ByVal Escribe As Boolean = True)
        Me.New()

        Try
            m_Path = Directorio
            m_FileName = Archivo
            m_Escribe = Escribe

            If Escribe Then
                If (Directory.Exists(m_Path)) Then
                    m_ExisteDirectorio = True
                Else
                    m_ExisteDirectorio = False
                    Throw New Exception("No existe el directorio '" & m_Path & "'")
                End If
            End If
        Catch oe As Exception
            Throw oe
        End Try
    End Sub

    ''' <summary>
    ''' Crea un archivo de Log
    ''' </summary>
    ''' <param name="Archivo">
    ''' Ruta y nombre de archivo
    ''' </param>
    ''' <remarks></remarks>
    Public Sub New(ByVal Archivo As String, Optional ByVal Escribe As Boolean = True)
        Me.New()

        Try
            m_Escribe = Escribe

            If Not Escribe Then Exit Sub

            If Archivo.IndexOf("\") > -1 Then
                m_Path = Archivo.Substring(0, Archivo.LastIndexOf("\") + 1)
                m_FileName = Archivo.Substring(Archivo.LastIndexOf("\") + 1)
            ElseIf Archivo.IndexOf("/") > -1 Then
                m_Path = Archivo.Substring(0, Archivo.LastIndexOf("/") + 1)
                m_FileName = Archivo.Substring(Archivo.LastIndexOf("/") + 1)
            Else
                Throw New Exception("La ruta no es válida o no existe el directorio.-")
            End If

            If (Directory.Exists(m_Path)) Then
                m_ExisteDirectorio = True
            Else
                m_ExisteDirectorio = False
                Throw New Exception("No existe el directorio '" & m_Path & "'")
            End If
        Catch oe As Exception
            Throw oe
        End Try
    End Sub

    Protected Overrides Sub Finalize()
        CloseAppend()
        MyBase.Finalize()
    End Sub
End Class
